package main

//读写锁
//import (
//	"fmt"
//	"sync"
//	"time"
//)
//
//var (
//	x    = 0
//	//lock = sync.Mutex{}
//	wg   = sync.WaitGroup{}
//	rwLock = sync.RWMutex{}
//)
//
//func read() {
//	defer wg.Done()
//	//lock.Lock()
//	rwLock.RLock()
//	fmt.Println(x)
//	time.Sleep(time.Millisecond)
//	//lock.Unlock()
//	rwLock.RUnlock()
//}
//
//func write() {
//	defer wg.Done()
//	//lock.Lock()
//	rwLock.Lock()
//	x = x + 1
//	time.Sleep(time.Millisecond * 5)
//	//lock.Unlock()
//	rwLock.Unlock()
//}
//
//func main() {
//	start := time.Now()
//	for i := 0; i < 10; i++ {
//		wg.Add(1)
//		go write()
//	}
//	time.Sleep(time.Second)
//	for i := 0; i < 1000; i++ {
//		wg.Add(1)
//		go read()
//	}
//
//	wg.Wait()
//	end := time.Now()
//	fmt.Println(end.Sub(start))
//}

//并发安全的map
import (
	"fmt"
	"strconv"
	"sync"
)
var (
	m sync.Map
	wg sync.WaitGroup
)

func main() {
	for i:=0;i<21;i++{
		wg.Add(1)
		go func(n int) {
			defer wg.Done()
			key := strconv.Itoa(n)
			m.Store(key, n)
			value, _ := m.Load(key)
			fmt.Printf("k=%v, v=%v\n", key, value)
		}(i)
	}
	wg.Wait()
}
